/**
 *
    算法描述：遍历4行字符串，数数就行，将结果存放在a数组中。如何输出a数组也是一个难点，你需要分析的是：1.输出多少行、多少列？ 2.每行数据里谁输出、谁不输出
    解决所需数据结构+算法：
**/
#include<iostream>
#include<cstring>
using namespace std;

int main() {
    int a[26], mx = -1;
    string s;
    memset(a, 0, sizeof(a));
    for(int i=0; i<4; i++) {
        getline(cin, s);
        for(int j=0; j<s.length(); j++) {
            if(s[j] == ' ') continue;   // 空格跳过
            a[s[j] - 'A']++;            // 将字母存放进对应的数组中
        }
    }
    for(int i=0; i<26; i++)             // 最大值就是需要输出的行数，烈数总是26个（字母表）
        if(a[i] > mx)   mx = a[i];
    for(int i=mx; i>0; i--) {           // 开始针对每行输出进行分析列输出，注意我这里for循环的细节处理
        for(int j=0; j<26; j++) {
            if(a[j] >= i)   cout << "* "; // a[j] >= i，是什么意思呢？
            else            cout << "  ";
        }
        cout << endl;
    }
    for(int i=0; i<26; i++) cout << (char)(i + 'A') << " ";
    return 0;
}